home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / COMPILER / SATHER / !Sather / Library / IO / sa / in < prev    next >
Text File  |  1996-04-09  |  3KB  |  83 lines

  1. ---------------------------> Sather 1.1 source file <--------------------------
  2. -- Copyright (C) International Computer Science Institute, 1994.  COPYRIGHT  --
  3. -- NOTICE: This code is provided "AS IS" WITHOUT ANY WARRANTY and is subject --
  4. -- to the terms of the SATHER LIBRARY GENERAL PUBLIC LICENSE contained in    --
  5. -- the file "Doc/License" of the Sather distribution.  The license is also   --
  6. -- available from ICSI, 1947 Center St., Suite 600, Berkeley CA 94704, USA.  --
  7. --------> Please email comments to "sather-bugs@icsi.berkeley.edu". <----------
  8.  
  9. -- in.sa: Input from stdin.
  10. -------------------------------------------------------------------
  11. class IN is
  12.     -- Direct access to stdin.
  13.  
  14.     create:SAME is return self end;   
  15.     
  16.     get_char:INT is
  17.     -- Retrieve a single character as an INT from stdin, negative for
  18.     -- end of file.  Built-in.
  19.     builtin IN_GETCHAR;
  20.     end;
  21.  
  22.     get_str:STR is
  23.     -- A string containing the characters on stdin up to the next
  24.     -- newline.
  25.     return get_line.str;
  26.     end;
  27.     
  28.     get_line:FSTR is
  29.     -- A string buffer containing the characters on stdin up to the 
  30.     -- next newline.
  31.     return append_line(void);
  32.     end;
  33.     
  34.     private const size : INT := 256;
  35.     append_line(s:FSTR):FSTR is
  36.     -- Retrieve a string from stdin up to the next newline and append 
  37.     -- it to `s'.
  38.     
  39.     -- Implementation contributed by hikichi@srarc2.sra.co.jp
  40.     -- (Nobuyuki Hikichi).
  41.  
  42.     bsize ::= size;
  43.     loop
  44.         buf ::= #FSTR(bsize); -- buffer to hold C string
  45.         buf.loc := bsize - 1;
  46.         get_str_sized(buf, bsize);
  47.  
  48.         m: INT := buf.index_of('\n');
  49.         if m >= 0 then buf.loc := m; return s + buf; end; 
  50.  
  51.         n: INT := buf.index_of('\0');
  52.         if n = -1 then s := s + buf; bsize := bsize * 2;
  53.         elsif n = 0 then return s;
  54.         elsif n <= (bsize - 1) then buf.loc := n; return s + buf;
  55.         else raise "IN::append_line, out of range [-1, bsize-1]";
  56.         end;  -- if
  57.     end; -- loop
  58.     end; -- fstr (s:FSTR)
  59.  
  60.     private get_str_sized(buf:FSTR,sz:INT) is
  61.     -- Read at most sz-1 characters and place them in buf,
  62.     -- followed by trailing '\0'.  Built-in.
  63.     builtin IN_GET_STR_SIZED;
  64.     end;
  65.  
  66.     error:BOOL is
  67.     -- true if an error has been encountered.  Cleared by "clear".
  68.     return RUNTIME::ferror(FILE::stdin_macro);
  69.     end;
  70.  
  71.     eof:BOOL is
  72.     -- true if EOF has been encountered.  Cleared by "clear".
  73.     return RUNTIME::feof(FILE::stdin_macro);
  74.     end;
  75.  
  76.     clear is
  77.     -- resets end_seen and error status
  78.     RUNTIME::clearerr(FILE::stdin_macro);
  79.     end;
  80.     
  81. end; -- class IN
  82.     
  83.